home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #4 / Amiga Plus CD - 2000 - No. 4.iso / Tools / Emulatoren / UAE0.6.4 / amiga / source / uae-control.c < prev    next >
C/C++ Source or Header  |  2000-05-27  |  14KB  |  476 lines

  1. /***********************************************************
  2.  * UAE - The U*nix Amiga Emulator                          *
  3.  *                                                         *
  4.  * UAE-Control -- Emulator Control from Inside Emulation   *
  5.  *  (c) 1996 Tauno Taipaleenmaki <tataipal@raita.oulu.fi>  *
  6.  *                                                         *
  7.  * Version 0.1                                             *
  8.  *                                                         *
  9.  * Requires V36 or higher. Compiled with SAS/C 6.5         *
  10.  *                                                         *
  11.  * People with KS1.3 or lower should use the command line  *
  12.  * version "uaectrl"                                       *
  13.  ***********************************************************/
  14. #include <proto/exec.h>
  15. #include <proto/intuition.h>
  16. #include <proto/gadtools.h>
  17. #include <proto/graphics.h>
  18. #include <proto/reqtools.h>
  19. #include <intuition/intuition.h>
  20. #include <libraries/reqtools.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include "uae-control.h"
  24. #include "uae_pragmas.h"
  25.  
  26. #define MAX_DRV_NAME          20
  27.  
  28.      struct Library              *ReqBase; 
  29.      struct Library              *UaeBase;
  30.      struct Window               *window;
  31.      struct Screen               *scr;
  32.      struct Gadget               *glist;
  33.      APTR                        VisInfo;
  34.  
  35. struct UAE_CONFIG      config;
  36.  
  37. struct TextAttr topaz8 = {
  38.        ( STRPTR )"topaz.font", 8, 0x00, 0x01 };
  39.  
  40. struct NewWindow newwindow = {
  41.        20,20, 400,160, 0,1,
  42.      IDCMP_CLOSEWINDOW | BUTTONIDCMP | CYCLEIDCMP | INTEGERIDCMP,
  43.      WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_DEPTHGADGET,
  44.      NULL,NULL,(UBYTE *)"UAE-Control v0.1",NULL,NULL,
  45.      0,0,0,0, CUSTOMSCREEN
  46. };
  47.  
  48. int setup_window(void);
  49. void quit_program(int error, char *text);
  50. void print_drive_status(void);
  51.  
  52. /************************************
  53.  * Main program                     *
  54.  ************************************/
  55. int main()
  56. {
  57.        int                  quit = 0,i;
  58.        struct IntuiMessage  *msg;
  59.        struct Gadget        *button;
  60.        struct StringInfo    *strinfo;
  61.        char                 buf[257];
  62.        UWORD                koodi, msgID;
  63.        ULONG                classi, number;
  64.        APTR                 address;
  65.        ULONG                CycleTags[3];
  66.  
  67.        CycleTags[0] = GTCY_Active;
  68.        CycleTags[1] = (ULONG)&number;
  69.        CycleTags[2] = TAG_DONE;
  70.        
  71.        ReqBase = OpenLibrary("reqtools.library",0);
  72.        if (!ReqBase) {
  73.           quit_program(1, "Reqtools.library needed!");
  74.           return(1);
  75.        }
  76.        UaeBase = OpenLibrary("uae.library",0);
  77.        if (!UaeBase) {
  78.           UaeBase = OpenLibrary("uae.library",0);
  79.           if (!UaeBase) {
  80.              quit_program(1, "Emulator not running or uae.library not installed.\n");
  81.              return(1);
  82.           }
  83.        }
  84. /* Read UAE configuration */
  85.        i = GetUaeConfig( &config );
  86.        
  87.        i = setup_window();
  88.        if (i == 0) {
  89.           quit_program(1, "Cannot setup a window!");
  90.           return(1);
  91.        }
  92.        while( quit == 0 ) {
  93.           WaitPort(window->UserPort);
  94.           while( msg = (struct IntuiMessage *)GT_GetIMsg(window->UserPort))
  95.         {
  96.                classi = msg->Class;
  97.                koodi = msg->Code;
  98.                address = msg->IAddress;
  99.                if (classi == IDCMP_GADGETUP) {
  100.                   msgID = ((struct Gadget *)msg->IAddress)->GadgetID;
  101.                   button = (struct Gadget *)msg->IAddress;
  102.                   if (button->SpecialInfo) {
  103.                      strinfo = (struct StringInfo *)button->SpecialInfo;
  104.                   }
  105.                } else
  106.              msgID = msg->Code;
  107.  
  108.                GT_ReplyIMsg((struct IntuiMessage *)msg);
  109.                
  110.                switch( classi ) {
  111.             case IDCMP_CLOSEWINDOW:
  112.                   quit = 1;
  113.                   break;
  114.             case IDCMP_GADGETUP:
  115.                   switch( msgID ) {
  116.                    case GAD_EXITEMU:
  117.                      ExitEmu();
  118.                      break;
  119.                    case GAD_EJECT_DF0:
  120.                      EjectDisk(0);
  121.                      GetUaeConfig( &config );
  122.                      print_drive_status();
  123.                      break;
  124.                    case GAD_EJECT_DF1:
  125.                      EjectDisk(1);
  126.                      GetUaeConfig( &config );
  127.                      print_drive_status();
  128.                      break;
  129.                    case GAD_EJECT_DF2:
  130.                      EjectDisk(2);
  131.                      GetUaeConfig( &config );
  132.                      print_drive_status();
  133.                      break;
  134.                    case GAD_EJECT_DF3:
  135.                      EjectDisk(3);
  136.                      GetUaeConfig( &config );
  137.                      print_drive_status();
  138.                      break;
  139.                    case GAD_SOUND:
  140.                      if (config.do_output_sound) {
  141.                         DisableSound();
  142.                      } else {
  143.                         EnableSound();
  144.                      }
  145.                      GetUaeConfig( &config );
  146.                      break;
  147.                    case GAD_JOYSTICK:
  148.                      if (config.do_fake_joystick) { 
  149.                         DisableJoystick();
  150.                      } else {
  151.                         EnableJoystick();
  152.                      }
  153.                      GetUaeConfig( &config );
  154.                      break;
  155.                    case GAD_FRAMERATE:
  156.                      SetFrameRate( strinfo->LongInt );
  157.                      GetUaeConfig( &config );
  158.                      break;
  159.                    case GAD_INSERT_DF0:
  160.                      i = rtGetStringA( (UBYTE *)&buf, 255, 
  161.                           (UBYTE *)"Disk-file name:",
  162.                           NULL, TAG_DONE);
  163.                      if (i) {
  164.                         InsertDisk((UBYTE *)&buf, 0);
  165.                         GetUaeConfig( &config );
  166.                         print_drive_status();
  167.                      }
  168.                      break;
  169.                    case GAD_INSERT_DF1:
  170.                      i = rtGetStringA( (UBYTE *)&buf, 255,
  171.                               (UBYTE *)"Disk-file name:",
  172.                               NULL, TAG_DONE);
  173.                      if (i) {
  174.                         InsertDisk((UBYTE *)&buf, 1);
  175.                         GetUaeConfig( &config );
  176.                         print_drive_status();
  177.                      }
  178.                      break;
  179.                    case GAD_INSERT_DF2:
  180.                      i = rtGetStringA( (UBYTE *)&buf, 255,
  181.                               (UBYTE *)"Disk-file name:",
  182.                               NULL, TAG_DONE);
  183.                      if (i) {
  184.                         InsertDisk((UBYTE *)&buf, 2);
  185.                         GetUaeConfig( &config );
  186.                         print_drive_status();
  187.                      }
  188.                      break;
  189.                    case GAD_INSERT_DF3:
  190.                      i = rtGetStringA( (UBYTE *)&buf, 255,
  191.                               (UBYTE *)"Disk-file name:",
  192.                               NULL, TAG_DONE);
  193.                      if (i) {
  194.                         InsertDisk((UBYTE *)&buf, 3);
  195.                         GetUaeConfig( &config );
  196.                         print_drive_status();
  197.                      }
  198.                      break;
  199.                    case GAD_LANGUAGE:
  200.                      number = config.keyboard;
  201.                      number++;
  202.                      if (number == 5) 
  203.                        number = 0;
  204.                      ChangeLanguage( number );
  205.                      GetUaeConfig( &config );
  206.                      break;
  207.                    case GAD_RESET:
  208.                      ColdReboot();
  209.                      break;
  210.                    case GAD_DEBUG:
  211.                      DebugFunc();
  212.                      break;
  213.                    default:
  214.                      break;
  215.                   }
  216.                   break;
  217.             default:
  218.                   break;
  219.                }
  220.         }
  221.        }
  222.        quit_program(0, "");
  223.        return(0);
  224. }
  225.  
  226. /******************************************
  227.  * Quits the program                      *
  228.  ******************************************/
  229. void quit_program(int error, char *text)
  230. {
  231.        if (error > 0) {
  232.           printf(" UAE-Control v0.1\n");
  233.           printf("  (c)1996 Tauno Taipaleenmaki\n\n");
  234.           printf(" ERROR: %s\n", text);
  235.        }
  236.        if (scr) 
  237.      UnlockPubScreen(NULL, scr);
  238.        if (window)
  239.      CloseWindow( window );
  240.        if (VisInfo)
  241.      FreeVisualInfo( VisInfo );
  242.        if (glist)
  243.      FreeGadgets( glist );
  244.        if (ReqBase)
  245.      CloseLibrary( ReqBase );
  246.        if (UaeBase)
  247.      CloseLibrary( UaeBase );
  248. }
  249.  
  250.  
  251. /******************************************
  252.  * Opens up the window & sets the gadgets *
  253.  ******************************************/
  254. int setup_window(void)
  255. {
  256.        struct Gadget           *g;
  257.        struct NewGadget        ng;
  258.        UWORD                   offy;
  259.        ULONG                   drawtags[20];
  260.  
  261.        static const char *keyb_langs[] =
  262.      {
  263.         "US",
  264.         "DE",
  265.         "SE",
  266.         "FR",
  267.         "IT",
  268.         NULL
  269.      };
  270.  
  271.        scr = LockPubScreen(NULL);
  272.        if (!scr)
  273.      return(0);
  274.        
  275.        VisInfo = GetVisualInfo( scr, TAG_DONE );
  276.        if (!VisInfo)
  277.      return(0);
  278.        
  279.        offy = scr->WBorTop + scr->RastPort.TxHeight + 1;
  280.  
  281. /* Create buttons */
  282.        g = CreateContext( &glist );
  283.        if (!g)
  284.      return(0);
  285.        
  286.        ng.ng_TextAttr = &topaz8;
  287.        ng.ng_VisualInfo = VisInfo;
  288.        ng.ng_Flags = PLACETEXT_IN;
  289.        ng.ng_LeftEdge = 10; ng.ng_TopEdge = offy + 10;
  290.        ng.ng_Width = 90; ng.ng_Height = 15;
  291.        ng.ng_GadgetText = (UBYTE *)"Hard reset";
  292.        ng.ng_GadgetID = GAD_RESET;
  293.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  294.        
  295.        ng.ng_LeftEdge = 102; ng.ng_Width = 50;
  296.        ng.ng_GadgetText = (UBYTE *)"Debug";
  297.        ng.ng_GadgetID = GAD_DEBUG;
  298.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  299.        
  300.        ng.ng_LeftEdge = 153; ng.ng_Width = 50;
  301.        ng.ng_GadgetText = (UBYTE *)"Exit";
  302.        ng.ng_GadgetID = GAD_EXITEMU;
  303.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  304.  
  305. /* Eject buttons */
  306.        ng.ng_LeftEdge = 250; ng.ng_Width = 70;
  307.        ng.ng_TopEdge = offy + 35;
  308.        ng.ng_GadgetID = GAD_EJECT_DF0;
  309.        ng.ng_GadgetText = (UBYTE *)"Eject";
  310.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  311.        ng.ng_TopEdge = offy + 53;
  312.        ng.ng_GadgetID = GAD_EJECT_DF1;
  313.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  314.        ng.ng_TopEdge = offy + 70;
  315.        ng.ng_GadgetID = GAD_EJECT_DF2;
  316.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  317.        ng.ng_TopEdge = offy + 87;
  318.        ng.ng_GadgetID = GAD_EJECT_DF3;
  319.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  320.  
  321. /* Insert buttons */
  322.        ng.ng_LeftEdge = 321; ng.ng_TopEdge = offy + 35;
  323.        ng.ng_GadgetID = GAD_INSERT_DF0;
  324.        ng.ng_GadgetText = (UBYTE *)"Insert";
  325.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  326.        ng.ng_TopEdge = offy + 53;
  327.        ng.ng_GadgetID = GAD_INSERT_DF1;
  328.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  329.        ng.ng_TopEdge = offy + 70;
  330.        ng.ng_GadgetID = GAD_INSERT_DF2;
  331.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  332.        ng.ng_TopEdge = offy + 87;
  333.        ng.ng_GadgetID = GAD_INSERT_DF3;
  334.        g = CreateGadgetA(BUTTON_KIND, g, &ng, TAG_DONE);
  335.  
  336. /* Sound & Joystick buttons */       
  337.  
  338.        ng.ng_LeftEdge = 120;
  339.        ng.ng_TopEdge = 120;
  340.        ng.ng_GadgetID = GAD_SOUND;
  341.        ng.ng_GadgetText = (UBYTE *)"Sound";
  342.        ng.ng_Flags = PLACETEXT_LEFT;
  343.        if (config.do_output_sound) {
  344.           drawtags[0] = GTCB_Checked;
  345.           drawtags[1] = 1;
  346.           drawtags[2] = TAG_DONE;
  347.        } else {
  348.           drawtags[0] = TAG_DONE;
  349.        }
  350.        g = CreateGadgetA(CHECKBOX_KIND, g, &ng,(struct TagItem *)&drawtags);
  351.        
  352.        ng.ng_TopEdge = 135;
  353.        ng.ng_GadgetID = GAD_JOYSTICK;
  354.        ng.ng_GadgetText = (UBYTE *)"Fake Joystick";
  355.        if (config.do_fake_joystick) {
  356.           drawtags[0] = GTCB_Checked;
  357.           drawtags[1] = 1;
  358.           drawtags[2] = TAG_DONE;
  359.        } else {
  360.           drawtags[0] = TAG_DONE;
  361.        }
  362.        g = CreateGadgetA(CHECKBOX_KIND, g, &ng, (struct TagItem *)&drawtags);
  363.  
  364.        ng.ng_TopEdge = 130;
  365.        ng.ng_LeftEdge = 160;
  366.        ng.ng_GadgetID = GAD_LANGUAGE;
  367.        ng.ng_GadgetText = (UBYTE *)"Language";
  368.        ng.ng_Flags = PLACETEXT_ABOVE;
  369.        drawtags[0] = GTCY_Labels;
  370.        drawtags[1] = (ULONG)keyb_langs;
  371.        drawtags[2] = GTCY_Active;
  372.        drawtags[3] = config.keyboard;
  373.        drawtags[4] = TAG_DONE;
  374.        g = CreateGadgetA(CYCLE_KIND, g, &ng, (struct TagItem *)&drawtags);
  375.  
  376.        ng.ng_TopEdge = 130;
  377.        ng.ng_LeftEdge = 250;
  378.        ng.ng_GadgetID = GAD_FRAMERATE;
  379.        ng.ng_GadgetText = (UBYTE *)"Framerate";
  380.        ng.ng_Flags = PLACETEXT_ABOVE;
  381.        drawtags[0] = GTIN_Number;
  382.        drawtags[1] = config.framerate;
  383.        drawtags[2] = TAG_DONE;
  384.        g = CreateGadgetA(INTEGER_KIND, g, &ng, (struct TagItem *)&drawtags);
  385.        
  386.        newwindow.FirstGadget = glist;
  387.        newwindow.Screen = scr;             /* Store screen ptr */
  388.        window = OpenWindow( &newwindow );
  389.        if (!window)
  390.      return(0);
  391.  
  392. /* Draw texts etc... */
  393.        Move(window->RPort, 10, offy + 35 + 10);
  394.        Text(window->RPort, (UBYTE *)"DF0:", 4);
  395.        Move(window->RPort, 10, offy + 53 + 10);
  396.        Text(window->RPort, (UBYTE *)"DF1:", 4);
  397.        Move(window->RPort, 10, offy + 70 + 10);
  398.        Text(window->RPort, (UBYTE *)"DF2:", 4);
  399.        Move(window->RPort, 10, offy + 87 + 10);
  400.        Text(window->RPort, (UBYTE *)"DF3:", 4);
  401.  
  402.        drawtags[0] = (GT_VisualInfo);
  403.        drawtags[1] = (ULONG)VisInfo;
  404.        drawtags[2] = GTBB_Recessed;
  405.        drawtags[3] = 1;
  406.        drawtags[4] = TAG_DONE;
  407.        
  408.        DrawBevelBoxA(window->RPort, 5, offy + 34, 
  409.              390, 17, (struct TagItem *)&drawtags);
  410.        DrawBevelBoxA(window->RPort, 5, offy + 52,
  411.              390, 17, (struct TagItem *)&drawtags);
  412.        DrawBevelBoxA(window->RPort, 5, offy + 69,
  413.              390, 17, (struct TagItem *)&drawtags);
  414.        DrawBevelBoxA(window->RPort, 5, offy + 86,
  415.              390, 17, (struct TagItem *)&drawtags);
  416.  
  417.        print_drive_status();
  418.  
  419.        UnlockPubScreen(NULL, scr);
  420.        return(1);
  421. }
  422.  
  423. void print_drive_status(void)
  424. {
  425.        char     empty[80];
  426.        int      len;
  427.        UWORD    offy = scr->WBorTop + scr->RastPort.TxHeight + 1;
  428.        
  429.        for(len=0;len<80;len++) 
  430.      empty[len] = ' ';
  431.        empty[79] = '\0';
  432.        
  433.        Move(window->RPort, 42, offy + 45);
  434.        if (config.disk_in_df0) {
  435.           len = strlen( config.df0_name );
  436.           if (len > MAX_DRV_NAME)
  437.         len = MAX_DRV_NAME;
  438.           Text(window->RPort, (UBYTE *)config.df0_name, len);
  439.        } else {
  440.           Text(window->RPort, (UBYTE *)empty, MAX_DRV_NAME);
  441.        }
  442.        
  443.        Move(window->RPort, 42, offy + 63);
  444.        if (config.disk_in_df1) {
  445.           len = strlen( config.df1_name );
  446.           if (len > MAX_DRV_NAME)
  447.         len = MAX_DRV_NAME;
  448.           Text(window->RPort, (UBYTE *)config.df1_name, len);
  449.        } else {
  450.           Text(window->RPort, (UBYTE *)empty, MAX_DRV_NAME);
  451.        }
  452.        
  453.        Move(window->RPort, 42, offy + 80);
  454.        if (config.disk_in_df2) {
  455.           len = strlen( config.df2_name );
  456.           if (len > MAX_DRV_NAME)
  457.         len = MAX_DRV_NAME;
  458.           Text(window->RPort, (UBYTE *)config.df2_name, len);
  459.        } else {
  460.           Text(window->RPort, (UBYTE *)empty, MAX_DRV_NAME);
  461.        }
  462.        
  463.        Move(window->RPort, 42, offy + 97);
  464.        if (config.disk_in_df3) {
  465.           len = strlen( config.df3_name );
  466.           if (len > MAX_DRV_NAME)
  467.         len = MAX_DRV_NAME;
  468.           Text(window->RPort, (UBYTE *)config.df3_name, len);
  469.        } else {
  470.           Text(window->RPort, (UBYTE *)empty, MAX_DRV_NAME);
  471.        }
  472. }
  473.  
  474.  
  475.  
  476.